package cn.kduck.code.module.service.impl;

import cn.kduck.code.entity.service.Entity;
import cn.kduck.code.module.query.ModuleEntityQuery;
import cn.kduck.code.module.query.ModuleQuery;
import cn.kduck.code.module.service.Module;
import cn.kduck.code.module.service.ModuleEntity;
import cn.kduck.code.module.service.ModuleService;
import cn.kduck.core.dao.query.QuerySupport;
import cn.kduck.core.service.DefaultService;
import cn.kduck.core.service.ParamMap;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.List;
import java.util.Map;

@Service
public class ModuleServiceImpl extends DefaultService implements ModuleService {
    @Override
    public void addModule(Module module,String[] entityIds) {
        super.add(CODE_MODULE, module);
        String moduleId = module.getModuleId();

        addModuleEntity(entityIds, moduleId);
    }

    private void addModuleEntity(String[] entityIds, String moduleId) {
        ModuleEntity[] moduleEntitys = new ModuleEntity[entityIds.length];
        for (int i = 0; i < entityIds.length; i++) {
            moduleEntitys[i] = new ModuleEntity(moduleId, entityIds[i]);
        }
        super.batchAdd(CODE_MODULE_ENTITY, moduleEntitys);
    }

    @Override
    public void updateModule(Module module,String[] entityIds) {
        super.update(CODE_MODULE, module);

        String moduleId = module.getModuleId();
        super.delete(CODE_MODULE_ENTITY,"moduleId", moduleId);
        addModuleEntity(entityIds, moduleId);
    }

    @Override
    public void deleteModule(String[] ids) {
        super.delete(CODE_MODULE,ids);
    }

    @Override
    public Module getModule(String moduleId) {
        Module module = super.getForBean(CODE_MODULE, moduleId, Module::new);

        Map<String, Object> paramMap = ParamMap.create("moduleId", moduleId).toMap();
        QuerySupport query = super.getQuery(ModuleEntityQuery.class, paramMap);
        List<Entity> entityList = super.listForBean(query, Entity::new);
        module.setEntityList(entityList);
        return module;
    }

    @Override
    public List<Module> listModule() {
        QuerySupport query = super.getQuery(ModuleQuery.class, ParamMap.create().toMap());
        List<Module> moduleList = super.listForBean(query, Module::new);
        return moduleList;
    }
}
